package com.zfl.service.impl;

import com.zfl.common.Result;
import com.zfl.entity.User;
import com.zfl.mapper.UserMapper;
import com.zfl.service.RegisterService;
import com.zfl.utils.PasswordUtils;
import com.zfl.vo.RegisterRequestVO;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;

@Service
@RequiredArgsConstructor
@Slf4j
public class RegisterServiceImpl implements RegisterService {

    private final UserMapper userMapper;

    // 默认注册用户的角色ID（假设普通用户角色ID=1，需根据实际数据库配置）
    private static final Long DEFAULT_ROLE_ID = 1L;

    @Override
    @Transactional // 确保用户插入和角色关联在同一事务
    public Result<?> register(RegisterRequestVO request) {
        String username = request.getUsername();
        String password = request.getPassword();
        String confirmPassword = request.getConfirmPassword();

        // ========== 步骤1：校验两次密码是否一致 ==========
        if (!password.equals(confirmPassword)) {
            return Result.fail(400, "两次输入的密码不一致");
        }

        // ========== 步骤2：校验用户名是否已存在 ==========
        int count = userMapper.countByUsername(username);
        if (count > 0) {
            return Result.fail(400, "用户名已被注册，请更换");
        }

        // ========== 步骤3：构建用户实体（加密密码+初始化状态） ==========
        User user = new User();
        user.setUsername(username);
        user.setPassword(PasswordUtils.encrypt(password)); // 加密密码（核心安全操作）
        user.setStatus(1); // 状态：1-正常（默认未禁用）
        user.setPasswordTryCount(0); // 初始失败次数0
        user.setBanRemainingTime(0); // 初始无封禁时间
        user.setCreateTime(new Date()); // 注册时间

        // ========== 步骤4：保存用户到数据库 ==========
        userMapper.insert(user);
        log.info("用户[{}]注册成功，用户ID：{}", username, user.getId());

        // ========== 步骤5：关联默认角色（插入user_roles表） ==========
        userMapper.insertUserRole(user.getId(), DEFAULT_ROLE_ID);
        log.info("用户[{}]已关联默认角色（roleId={}）", username, DEFAULT_ROLE_ID);

        return Result.success("注册成功，请登录");
    }
}